package com.policenacorp.ejb.impl;

import java.security.Principal;
import java.util.Collection;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import javax.ejb.EJBContext;
import javax.ejb.SessionContext;
import javax.ejb.Stateless;
import javax.ejb.Timer;
import javax.ejb.TimerService;

import com.policenacorp.ejb.bean.local.EJBContextBeanLocal;
import com.policenacorp.ejb.bean.remote.EJBContextBeanRemote;

@Stateless
public class EJBContextBusiness implements EJBContextBeanLocal, EJBContextBeanRemote {

    @Resource
    private SessionContext context;
    private EJBContext ejbContext;

    public EJBContextBusiness() {
	// isso nao vai dar certo, pq context so vai pegar um valor apos a
	// injecao, que eh depois do construtor
	ejbContext = (EJBContext) context;
    }

    @PostConstruct
    private void initialize() {
	final boolean sessionContextNaoNulo = context != null;
	if (sessionContextNaoNulo) {
	    System.out.println("Aqui o recurso ja foi injetado.");
	    ejbContext = (EJBContext) context;
	}
    }

    @Override
    public void lookupEnc() {
	String obj = (String) ejbContext.lookup("objetoRecurso");
	System.out.println(String.format("Propriedade ENC: %s", obj));
    }

    public void imprimeTimerServices() {
	final TimerService timerService = ejbContext.getTimerService();
	final Collection<Timer> conjunto = timerService.getTimers();
	final boolean conjuntoNaoNulo = conjunto != null;
	System.out.println("Lista timers: " + conjunto);
	if (conjuntoNaoNulo) {
	    for (final Timer timer : conjunto) {
		System.out.println(String.format("Timer corrente: %s", timer));
	    }
	}
    }

    public void manipulaCaller() {
	final Principal caller = ejbContext.getCallerPrincipal();
	final boolean callerNaoNulo = caller != null;
	if (callerNaoNulo) {
	    System.out.println(String.format("Caller name: %s", caller.getName()));
	}
    }

}
